/*
题目: 完全平方数
给你一个整数 n ，返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数，其值等于另一个整数的平方；换句话说，其值等于一个整数自乘的积。例如，1、4、9 和 16 都是完全平方数，而 3 和 11 不是。

https://leetcode.cn/problems/perfect-squares
 */
public class NumSquares {
    public int numSquares(int n) {
        // [整数划分]  类似题目
        // 表示和为 n 的完全平方数的最少数量
        int[] dp = new int[n + 1];
        for (int i = 1; i <= n; i ++)   dp[i] = i;


        // 对于每一个数
        for (int i = 4; i <= n; i ++) {
            int src = dp[i];
            // 只对 [完全平方数] 进行讨论
            for (int j = 1; j * j <= i; j ++) {
                // 13 --> 4 + 9 也就是 4 + dp[9]
                src = Math.min(src, 1 + dp[i - j * j]);
            }
            dp[i] = src;
        }

        return dp[n];
    }
}
